package com.kh.rationaldrugreview.entity;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 知识实体注册表实体类
 * 用于管理知识图谱中的所有实体，确保同一概念只有一个节点
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ToString
public class KnowledgeEntity {
    
    /**
     * 实体ID（主键）
     */
    private Long entityId;
    
    /**
     * 实体类型(DRUG,DISEASE,SYMPTOM,PATIENT_PROFILE,ADVERSE_REACTION等)
     */
    private String entityType;
    
    /**
     * 实体原始名称
     */
    private String entityName;
    
    /**
     * 标准化名称(用于去重)
     */
    private String canonicalName;
    
    /**
     * 显示名称
     */
    private String displayName;
    
    /**
     * Neo4j中的节点ID
     */
    private String neo4jNodeId;
    
    /**
     * 实体属性(JSON格式)
     */
    private Map<String, Object> attributes;
    
    /**
     * 别名列表(JSON数组)
     */
    private List<String> aliases;
    
    /**
     * 来源(PDF文件名等)
     */
    private String source;
    
    /**
     * 首次提取时间
     */
    private LocalDateTime firstExtractedAt;
    
    /**
     * 最后更新时间
     */
    private LocalDateTime lastUpdatedAt;
    
    /**
     * 出现频次
     */
    private Integer frequency;
    
    /**
     * 置信度分数
     */
    private BigDecimal confidenceScore;
    
    /**
     * 是否已人工验证
     */
    private Boolean isValidated;
    
    /**
     * 是否有效
     */
    private Boolean isActive;
    
    /**
     * 创建时间
     */
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    private LocalDateTime updatedAt;
    
    /**
     * 创建人
     */
    private String createdBy;
    
    /**
     * 更新人
     */
    private String updatedBy;
    
    /**
     * 判断是否为药品实体
     */
    public boolean isDrug() {
        return "DRUG".equals(entityType);
    }
    
    /**
     * 判断是否为疾病实体
     */
    public boolean isDisease() {
        return "DISEASE".equals(entityType);
    }
    
    /**
     * 判断是否为症状实体
     */
    public boolean isSymptom() {
        return "SYMPTOM".equals(entityType);
    }
    
    /**
     * 判断是否为患者画像实体
     */
    public boolean isPatientProfile() {
        return "PATIENT_PROFILE".equals(entityType);
    }
    
    /**
     * 判断是否为不良反应实体
     */
    public boolean isAdverseReaction() {
        return "ADVERSE_REACTION".equals(entityType);
    }
}